﻿

function ancestor(child, parent) {
    if (child == null) return false; //Saves checking elsewhere
    //This is a fix for a Firefox bug *gasp*
    //Aparantly causes a bug in Opera!
    //I see no choice but a browser detect. *sigh* I didn't want to have to do this.
    if (navigator.userAgent.indexOf('Gecko') != -1 && navigator.userAgent.indexOf('Opera') == -1) {
        //This should only be run by Gecko based browsers. this code should be fine in everything but Opera so forge away browsers.
        var allc = parent.getElementsByTagName('*');
        for (var i = 0; i < allc.length; i++) {
            if (allc[i] == child) {
                return true;
            }
        }
    }
    else {
        //http://www.dynamicdrive.com/forums/showthread.php?t=12341 Thanks Twey!
        for (; child.parentNode; child = child.parentNode) {
            if (child.parentNode === parent) return true;
        }
    }
    return false;
}
function mladdevents() {
    //    window.mlOverStack = [];
    //    window.mlOverStackPointer = -1;
    //	if(window.mlrunShim == true){
    //		var Iframe = document.createElement("iframe");
    //		Iframe.setAttribute("src","about:blank");
    //		Iframe.setAttribute("scrolling","no");
    //		Iframe.setAttribute("frameBorder","0");
    //		Iframe.style.zIndex = "2";
    //		Iframe.style.filter = 'alpha(opacity=0)';
    //		
    //		var uls = document.getElementsByTagName('ul');
    //	    for(var j=0;j<uls.length;j++){
    //	        if(uls[j].parentNode && uls[j].parentNode.parentNode && uls[j].parentNode.parentNode.parentNode && 
    //	            uls[j].parentNode.parentNode.parentNode.nodeName == 'DIV' && 
    //	            uls[j].parentNode.parentNode.parentNode.className.indexOf('mlmenu') != -1){
    //    	        
    //	            uls[j].style.marginLeft = '-' + (uls[j].parentNode.offsetWidth - 4) + 'px';
    //	        }
    //	    }
    //	}
    //	var effects_a = new Array();
    //	var divs = document.getElementsByTagName('div');
    //	for(var j=0;j<divs.length;j++){
    //		if(divs[j].className.indexOf('mlmenu') != -1){
    //			var lis = divs[j].getElementsByTagName('li');
    //			for(var i =0;i<lis.length;i++){
    //			    if(lis[i].className.indexOf('separator') >= 0)
    //			        continue;
    //			    if(window.mlrunShim == true){
    //				    lis[i].onmouseenter = mlover;
    //				    lis[i].onmouseleave = mlout;
    //				}
    //				else{
    //				    lis[i].onmouseover = mlover;
    //				    lis[i].onmouseout = mlout;
    //				}
    //				if(window.mlrunShim == true){
    //					lis[i].appendChild(Iframe.cloneNode(false));
    //				}
    //				if(lis[i].getElementsByTagName('ul').length > 0){
    //					lis[i].className += ' haschild';
    //                    lis[i].getElementsByTagName('a')[0].className += ' haschild';
    //				}
    //				var uls = lis[i].getElementsByTagName('ul');
    //				for(var k=0;k<uls.length;k++){
    //					var found = 'no';
    //					for(var z=0;z<effects_a.length;z++){
    //						if(effects_a[z] == uls[k]){
    //							found = 'yes';
    //						}
    //					}
    //					if(found == 'no'){
    //						effects_a[effects_a.length] = uls[k];
    //						uls[k].style.zIndex = '100';
    //						mlEffectLoad(uls[k]);
    //					}
    //				}
    //			}
    //		}
    //	}
}
function mlout(e) {
    if (!e) {
        var the_e = window.event;
    }
    else {
        var the_e = e;
    }
    clearTimeout(window.mlTimeout);
    var reltg = (the_e.relatedTarget) ? the_e.relatedTarget : the_e.toElement;
    if (reltg) {
        var under = ancestor(reltg, this);
        if (under === false && reltg != this) {
            window.mlCurrentOver = null;
            var parent = this.parentNode;
            while (parent.parentNode && parent.className.indexOf('mlmenu') == -1) {
                parent = parent.parentNode;
            }
            if (parent.className.indexOf('delay') != -1) {
                setTimeout(function () { mloutTick() }, 350);
            }
            else {
                mloutTick();
            }
        }
    }
}
function mloutTick() {
    //If there is nothing open, there is nothing to hide
    if (window.mlOverStackPointer < 0)
        return;

    //Find the top level div for the menu
    var divs = document.getElementsByTagName('div');
    var menu = null;
    for (var i = 0; i < divs.length; i++) {
        if (divs[i].className.indexOf('mlmenu') != -1)
            menu = divs[i];
    }

    //Hide all menu items that aren't an ancestor of the currently selected item
    var uls = menu.getElementsByTagName('ul');
    var sib;
    for (var i = 0; i < uls.length; i++) {
        if (window.mlCurrentOver == null || (!ancestor(window.mlCurrentOver, uls[i]) && uls[i].parentNode != window.mlCurrentOver)) {
            if (uls[i].style.display == 'block' && uls[i].parentNode.className.indexOf('mlmenu') == -1) {
                mlEffectOut(uls[i]);
                var lis = uls[i].childNodes;
                for (var j = 0; j < lis.length; j++)
                    if (lis[j].getElementsByTagName && lis[j].parentNode == uls[i] && lis[j].getElementsByTagName('ul').length > 0)
                        lis[j].className = 'haschild hide';
                if (window.mlrunShim == true) {
                    sib = uls[i];
                    while (sib.nextSibling && sib.nodeName != 'IFRAME') {
                        sib = sib.nextSibling
                    }
                    sib.style.display = 'none';
                }
            }
        }
    }

    //Update the mouseover stack
    if (window.mlCurrentOver == null) {
        window.mlOverStackPointer = -1;
    }
    else {
        for (var i = window.mlOverStackPointer; i >= 0; i--) {
            if (!ancestor(window.mlCurrentOver, window.mlOverStack[i]))
                window.mlOverStackPointer--;
        }
    }
}
function mlover(e) {
    if (!e) {
        var the_e = window.event;
    }
    else {
        var the_e = e;
    }
    the_e.cancelBubble = true;
    if (the_e.stopPropagation) {
        the_e.stopPropagation();
    }
    window.mlCurrentOver = this;
    if (window.mlOverStackPointer < 0 || window.mlCurrentOver != window.mlOverStack[window.mlOverStackPointer]) {
        mloutTick();
        window.mlOverStackPointer++;
        window.mlOverStack[window.mlOverStackPointer] = window.mlCurrentOver;
    }
    window.mlTimeout = setTimeout(function () { mloverTick() }, 250);
}
function mloverTick() {
    if (window.mlCurrentOver == null)
        return;
    var ob = window.mlCurrentOver.getElementsByTagName('ul');
    if (ob.length > 0) {
        if (window.mlrunShim == true) {
            var sib = ob[0];
            while (sib.nextSibling && sib.nodeName != 'IFRAME') {
                sib = sib.nextSibling
            }
            ob[0].style.display = 'block';
            sib.style.top = ob[0].offsetTop + 'px';
            sib.style.left = ob[0].offsetLeft - 2 + 'px';
            sib.style.width = ob[0].offsetWidth + 'px';
            sib.style.height = ob[0].offsetHeight - 2 + 'px';
            sib.style.border = '1px solid red';
            sib.style.display = 'block';
        }
        window.mlCurrentOver.className = 'haschild';
        mlEffectOver(ob[0], window.mlCurrentOver);
    }
}
function mlSetOpacity(ob, level) {
    if (ob) {
        //level is between 0 and 10
        //need to convert to decimal for standard
        var standard = level / 10;
        //need to convert to 0-100 scale for IE filter
        var ie = level * 10;
        ob.style.opacity = standard;
        ob.style.filter = "alpha(opacity=" + ie + ")"
    }
}
function mlIncreaseOpacity(ob) {
    var current = ob.style.opacity;
    if (lastob == ob && lastop == current) {
        //mlout has not interfered
        current = current * 10;
        var upone = current + 1;
        mlSetOpacity(ob, upone);
        lastob = ob;
        lastop = upone / 10;
    }
}
function mlIncreaseHeight(ob) {
    var current = parseInt(ob.style.height);
    var newh = current + 1;
    ob.style.height = newh + 'px';
}
function mlIncreaseWidth(ob) {
    var current = parseInt(ob.style.width);
    var newh = current + 1;
    ob.style.width = newh + 'px';
}
function mlBlink(ob) {
    var newb = '1px solid red';
    var old = '';
    if (ob.style.border == old) {
        ob.style.border = newb;
    }
    else {
        ob.style.border = old;
        ob.style.borderTop = '1px solid';
    }
}
function mlShake(ob) {
    var newp = '5px';
    var old = '';
    if (ob.style.paddingLeft == old) {
        ob.style.paddingLeft = newp;
    }
    else {
        ob.style.paddingLeft = old;
    }
}
function mlEffectOver(ob, parent) {
    switch (ob.className) {
        case 'fade':
            ob.style.display = 'block';
            if (ob.style.opacity == 0) {
                lastob = ob
                lastop = 0;
                for (var i = 1; i <= 10; i++) {
                    setTimeout(function () { mlIncreaseOpacity(ob) }, i * 50);
                }
                setTimeout(function () { ob.style.filter = '' }, 500);
            }
            break;
        case 'blink':
            ob.style.display = 'block';
            for (var i = 0; i < 10; i++) {
                setTimeout(function () { mlBlink(ob) }, i * 50);
            }
            break;
        case 'shake':
            ob.style.display = 'block';
            for (var i = 0; i < 10; i++) {
                setTimeout(function () { mlShake(ob) }, i * 50);
            }
            break;
        case 'blindv':
            ob.style.display = 'block';
            if (ob.offsetHeight) {
                var height = ob.offsetHeight
                ob.style.height = '0px';
                ob.style.overflow = 'hidden';
                for (var i = 0; i < height; i++) {
                    setTimeout(function () { mlIncreaseHeight(ob) }, i * 3);
                }
                setTimeout(function () { ob.style.overflow = 'visible'; }, height * 3)
            }
            break;
        case 'blindh':
            ob.style.display = 'block';
            if (ob.offsetWidth) {
                var width = ob.offsetWidth;
                ob.style.width = '0px';
                ob.style.overflow = 'hidden';
                for (var i = 0; i < width; i++) {
                    setTimeout(function () { mlIncreaseWidth(ob) }, i * 3);
                }
                setTimeout(function () { ob.style.overflow = 'visible'; }, width * 3)
            }
            break;
        default:
            ob.style.display = 'block';
            break;
    }
}
function mlEffectOut(ob) {
    switch (ob.className) {
        case 'fade':
            mlSetOpacity(ob, 0);
            ob.style.display = 'none';
            break;
        case 'blink':
            ob.style.border = '';
            ob.style.display = 'none';
            break;
        case 'shake':
            ob.style.paddingLeft = '';
            ob.style.display = 'none';
            break;
        default:
            ob.style.display = 'none';
            break;
    }
}
function mlEffectLoad(ob) {
    var parent = ob.parentNode;
    while (parent.parentNode && parent.className.indexOf('mlmenu') == -1) {
        parent = parent.parentNode;
    }
    if (parent.className.indexOf('fade') != -1) {
        ob.style.display = 'none';
        ob.className = 'fade';
        mlSetOpacity(ob, 0);
    }
    else if (parent.className.indexOf('blink') != -1) {
        ob.className = 'blink';
        ob.style.display = 'none';
    }
    else if (parent.className.indexOf('shake') != -1) {
        ob.className = 'shake';
        ob.style.display = 'none';
    }
    else if (parent.className.indexOf('blindv') != -1) {
        ob.className = 'blindv';
        ob.style.display = 'none';
    }
    else if (parent.className.indexOf('blindh') != -1) {
        ob.className = 'blindh';
        ob.style.display = 'none';
    }
    else {
        ob.className = 'none';
        ob.style.display = 'none';
    }
}